import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)

/**
 * Esta clase contiene todas las variables y metodos del jugador necesarias para que el juego pueda desarrollarse
 * @author Andres Tovar Jaime
 * @version 1 30-nov-2012
 */
public class Jugador extends Actor
{
    private Jugador jug; //variable de la clase jugador
    private Bala1 bala1; //variables de todos los tipos de balas
    private Bala2 bala2;
    private Bala3 bala3;
    private  boolean band; //bandera que indica el primer disparo del jugador para generar las balas necesarias
    private Mundo mundo;
    public int balas=20; //numero de balas del jugador
    private SimpleTimer timer=new SimpleTimer();  //contador
    private SimpleTimer timer2=new SimpleTimer();  //contador
    private int arma=1; //indica el tipo de arma equipada 1=comun 2=fuego 3=hielo
    private boolean muevo=true; //indica si el jugador puede moverse o no (si esta en contacto con un obstaculo, no)
    private Obstaculos algo,algo2; //los obstaculos en el juego si hay o no en el paso del jugador
    public int vidas=6; //el numero de vidas del jugador
    private Zombies zombie; //objeto que la clase zombies para acceder a sus metodos desde el jugador
    private Espinas espinas; 
    private marcadorBala marcadorBalas; //marcadores del numero de balas y vidas del jugador
    private marcadorVidas marcadorVida;
    private boolean muerto=false; //indica si esta muerto o no el jugador para avisarle al mundo y eliminarlo
    /**
     * Act - do whatever the Jugador wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    public void act() 
    {
        moverGirar();
        dispara();
        eligeArma();
        mePegaron();
        meMori();        
    }    
    
    /**
     * Constructor de la clase Jugador
     */
    public Jugador(marcadorBala marca,marcadorVidas marcab)
    {
        marcadorBalas=marca;
        marcadorVida=marcab;
        band = false;
    }
    
       /**
        * Metodo que segun la tecla que se este presionando el jugador se mueve,gira o dispara (si esta o no en 
        * contacto con un obstaculo)
        */
    public void moverGirar()
    {
        if(muevo)
        {
        if(!band)
        {
            mundo=(Mundo)this.getWorld();
            bala1 = mundo.dameBala();
            band=true;
            
        }
        if(Greenfoot.isKeyDown("up"))
        {
         if(timer2.millisElapsed() > 233)
        {
            Greenfoot.playSound("Paso.wav");
            timer2.mark();
            
        }
        move(2);
         }
        if(Greenfoot.isKeyDown("down"))
        {
        if(timer2.millisElapsed() > 233)
        {
            Greenfoot.playSound("Paso.wav");
            timer2.mark();
            
        }
        move(-2);
        }
        if(Greenfoot.isKeyDown("right"))
        turn(4);
        if(Greenfoot.isKeyDown("left"))
        turn(-4);
        }
        algo=(Obstaculos)getOneObjectAtOffset(0,0,Obstaculos.class);
        
        
        if(algo!=null || algo2!=null)
        {
            muevo=false;
            
             if(Greenfoot.isKeyDown("down"))
             move(-2);
            
        }
        else
        muevo=true;
        
         
    }
    
    /**
     * Metodo que permite que el jugador dispare(segun el tipo de arma que este equipada sera la clase de 
     * bala que se dibujara en el mundo)
     */
    public void dispara()
        {
            if(timer.millisElapsed()> 250 &&Greenfoot.isKeyDown("space")&&balas>0 && arma==2)
         {
            //World mundo=this.getWorld();
            bala2=new Bala2(this);
            Greenfoot.playSound("Disparo.wav");
            mundo.addObject(bala2,this.getX(),this.getY());
            bala2.setRotation(this.getRotation());
            balas--;
            marcadorBalas.disminuyeBalas();
            timer.mark();
         }
         if(timer.millisElapsed()> 250 &&Greenfoot.isKeyDown("space")&&balas>0 && arma==1)
         {
            //World mundo=this.getWorld();
            bala1=new Bala1(this);
            Greenfoot.playSound("Disparo.wav");
            mundo.addObject(bala1,this.getX(),this.getY());
            bala1.setRotation(this.getRotation());
            balas--;
            marcadorBalas.disminuyeBalas();
            timer.mark();
         }
         if(timer.millisElapsed()> 250 &&Greenfoot.isKeyDown("space")&&balas>0 && arma==3)
         {
            //World mundo=this.getWorld();
            bala3=new Bala3(this);
            Greenfoot.playSound("Disparo.wav");
            mundo.addObject(bala3,this.getX(),this.getY());
            bala3.setRotation(this.getRotation());
            balas--;
            marcadorBalas.disminuyeBalas();
            timer.mark();
         }
         
            
    }
    
    /**
     * Segun la tecla que se presione se cambia el tipo de arma que lleva el jugador
     */
    public void eligeArma()
    {
        if(Greenfoot.isKeyDown("1"))
        {
            
            if(timer.millisElapsed() > 500)
            {
                  arma=1;
                 Greenfoot.playSound("cambioArma.wav");
                 timer.mark();
            }
         }
        if(Greenfoot.isKeyDown("2"))
        {
            
            if(timer.millisElapsed() > 500)
            {
                arma=2;
             Greenfoot.playSound("cambioArma.wav");
             timer.mark();
            }
        }
        if(Greenfoot.isKeyDown("3"))
        {
            
            if(timer.millisElapsed() > 500)
            {
                arma=3;
               Greenfoot.playSound("cambioArma.wav");
               timer.mark();
            }
        }
    }
    
    /**
     * Checa que si esta en contacto con un objeto que lo dañe (Zombie o Espinas) disminuya las vidas del jugador
     */
    public void mePegaron()
    {
        zombie=(Zombies)getOneObjectAtOffset(1,1,Zombies.class);
        espinas=(Espinas)getOneObjectAtOffset(1,1,Espinas.class);
        
        if(zombie!=null)
        {
            vidas--;
            this.setLocation(this.getX()-25,this.getY()-25);
            Greenfoot.playSound("zombie2.wav");
            marcadorVida.disminuyeVida();
        }
         if(espinas!=null)
        {
            vidas--;
            this.setLocation(this.getX()-25,this.getY()-25);
            Greenfoot.playSound("Espinas.wav");
            marcadorVida.disminuyeVida();
        }
        
        
    }
   
   /**
    * Verifica que si las vidas del jugador son menores o iguales a 0 le avize al mundo que se murio y lo elimine
    * del mundo y cambia la bandera de muerto a verdadero
    */ 
    public void meMori()
    {
        if(vidas<=0)
        {
            Mundo mundo=(Mundo)this.getWorld();
            mundo.meMataron();
            muerto=true;
        }
    }
    
    /**
     * incrementa el numero de balas del jugador en 10
     */
    public void incrementaBalas()
    {
        balas=balas+10;
        marcadorBalas.aumentaBalas();
    }
    
     /**
     * incrementa el numero de vidas del jugador en 1
     */
    public void incrementaVida()
    {
        vidas=vidas+1;
        marcadorVida.aumentaVida();
    }
    
    /**
     * Regresa el numero de balas actuales del jugador
     */
    public int dameBalas()
    {
        return balas;
    }
    
    /**
     * Regresa la bandera de muerto (true si ya murio y false si aun no)
     */
    public boolean yaFue()
    {
        return muerto;
    }
    
    
    
}
